home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1995-12-04 | 4.4 KB | 111 lines | [TEXT/.Ob4] |
- Syntax10.Scn.Fnt
- Syntax10b.Scn.Fnt
- Syntax10i.Scn.Fnt
- MODULE Catalogs; (** CAS 11-Sep-90, CS 10 Aug 94 **)
- IMPORT Oberon, Viewers, Texts, TextFrames, MenuViewers;
- CONST
- Menu = "System.Close System.Copy System.Grow Edit.Search Edit.Store";
- TYPE
- LineBuf = ARRAY 128 OF CHAR;
- LineExt = ARRAY 32 OF CHAR;
- Line = POINTER TO LineDesc;
- LineDesc = RECORD
- l, r: Line;
- ext: LineExt;
- buf: LineBuf
- END;
- T: Texts.Text;
- W: Texts.Writer;
- PROCEDURE Str(s: ARRAY OF CHAR);
- BEGIN Texts.WriteString(W, s)
- END Str;
- PROCEDURE Int(i: LONGINT);
- BEGIN Texts.WriteInt(W, i, 0)
- END Int;
- PROCEDURE Ln;
- BEGIN Texts.WriteLn(W)
- END Ln;
- PROCEDURE OpenViewer(cmd: ARRAY OF CHAR);
- VAR V: MenuViewers.Viewer; x, y: INTEGER; t, d: LONGINT;
- BEGIN Oberon.AllocateUserViewer(Oberon.Mouse.X, x, y); T := TextFrames.Text(""); Texts.OpenBuf(W.buf);
- Str(cmd); Str(" "); Oberon.GetClock(t, d); Texts.WriteDate(W, t, d); Ln; Ln;
- V := MenuViewers.New(TextFrames.NewMenu(cmd, Menu), TextFrames.NewText(T, 0), TextFrames.menuH, x, y)
- END OpenViewer;
- PROCEDURE SortIn(VAR u: Line; v: Line);
- BEGIN
- IF u = NIL THEN u := v ELSIF v.ext < u.ext THEN SortIn(u.l, v) ELSE SortIn(u.r, v) END
- END SortIn;
- PROCEDURE OutLines(u: Line);
- VAR ext: LineExt; cnt: INTEGER;
- PROCEDURE Out(u: Line);
- BEGIN
- IF u # NIL THEN Out(u.l);
- IF ext # u.ext THEN
- IF cnt > 0 THEN Int(cnt); Str(" files"); Ln; Ln; cnt := 0 END;
- ext := u.ext; Str(ext); Ln
- END;
- Str(" "); Str(u.buf); Ln; INC(cnt); Out(u.r)
- END
- END Out;
- BEGIN ext[0] := 0X; cnt := 0; Out(u);
- IF cnt > 0 THEN Int(cnt); Str(" files"); Ln; Ln END
- END OutLines;
- PROCEDURE Stat*; (**marked directory viewer**)
- VAR V: Viewers.Viewer; dir: Texts.Text; R: Texts.Reader; S: Texts.Scanner; i, j, cnt: INTEGER; s, n: LONGINT;
- lines, line: Line; buf: LineBuf; ext: ARRAY 10 OF LineExt;
- BEGIN V := Oberon.MarkedViewer(); dir := V.dsc.next(TextFrames.Frame).text;
- OpenViewer("Catalogs.Stat"); cnt := 0; lines := NIL;
- ext[0] := "< 1K"; ext[1] := "< 2K"; ext[2] := "< 4K"; ext[3] := "< 8K";
- ext[4] := "< 16K"; ext[5] := "< 32K"; ext[6] := "< 64K"; ext[7] := "< 128K";
- ext[8] := "< 256K"; ext[9] := ">= 256K";
- Texts.OpenReader(R, dir, 0); Texts.Read(R, buf[0]);
- WHILE ~R.eot DO i := 0;
- WHILE ~R.eot & (buf[i] # 0DX) DO INC(i); Texts.Read(R, buf[i]) END;
- buf[i] := 0X;
- IF ~R.eot THEN INC(cnt);
- Texts.OpenScanner(S, dir, Texts.Pos(R) - 7); Texts.Scan(S);
- IF S.class = Texts.Int THEN s := S.i; j := 9; n := 40000H;
- LOOP
- IF s >= n THEN NEW(line); line.ext := ext[j]; line.buf := buf; SortIn(lines, line); EXIT END;
- n := n DIV 2; DEC(j); IF j < 0 THEN EXIT END
- END
- END;
- Texts.Read(R, buf[0])
- END
- END;
- OutLines(lines); Str("total of "); Int(cnt); Str(" files counted."); Ln;
- Texts.Append(T, W.buf);
- Oberon.Collect(0)
- END Stat;
- PROCEDURE Sort*; (**marked directory viewer**)
- VAR V: Viewers.Viewer; dir: Texts.Text; R: Texts.Reader; i, j, k, cnt: INTEGER; ch: CHAR;
- lines, line: Line; buf: LineBuf; ext: LineExt;
- l: INTEGER; (* position of first " *)
- BEGIN V := Oberon.MarkedViewer(); dir := V.dsc.next(TextFrames.Frame).text;
- OpenViewer("Catalogs.Sort"); cnt := 0; lines := NIL;
- Texts.OpenReader(R, dir, 0); Texts.Read(R, ch);
- WHILE ~R.eot DO i := 0; j := 0; k := -1; l := -1;
- WHILE ~R.eot & (ch # 0DX) DO
- buf[i] := ch; INC(i);
- IF k < 0 THEN
- IF ch = "." THEN j := i
- ELSIF (l < 0) & (ch = '"') THEN l := i (* <= CS, 9 Aug 94, ignore blanks within strings *)
- ELSIF (l >= 0) & (ch = '"') THEN l := -1
- ELSIF (l < 0) & (ch = " ") THEN k := i END
- END;
- Texts.Read(R, ch)
- END;
- buf[i] := 0X; IF k < 0 THEN k := i END;
- i := 0; WHILE (j < k) & (buf[j] # '"') DO ext[i] := buf[j]; INC(i); INC(j) END; (* <= CS, 9 Aug 94, skip " at end of extension *)
- IF (i > 0) & (ext[i - 1] = '"') THEN ext[i - 1] := 0X ELSE ext[i] := 0X END;
- IF ~R.eot THEN INC(cnt); NEW(line); line.ext := ext; line.buf := buf; SortIn(lines, line); Texts.Read(R, ch) END
- END;
- OutLines(lines); Str("total of "); Int(cnt); Str(" files processed."); Ln;
- Texts.Append(T, W.buf);
- Oberon.Collect(0)
- END Sort;
- BEGIN Texts.OpenWriter(W)
- END Catalogs.
- Catalogs.Stat (*marked directory viewer*)
- Catalogs.Sort (*marked directory viewer*)
-